<?php

/**
 * PHPUnit 测试引导文件
 * 设置测试环境和自动加载
 */

// 设置错误报告级别
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 设置时区
date_default_timezone_set('Asia/Shanghai');

// 设置内存限制
ini_set('memory_limit', '256M');

// 设置最大执行时间
set_time_limit(300);

// 定义项目根目录
define('PROJECT_ROOT', dirname(__DIR__));

// 设置包含路径
set_include_path(get_include_path() . PATH_SEPARATOR . PROJECT_ROOT);

// 自动加载函数
spl_autoload_register(function ($className) {
    // 处理测试命名空间
    if (strpos($className, 'Tests\\') === 0) {
        $file = __DIR__ . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, substr($className, 6)) . '.php';
        if (file_exists($file)) {
            require_once $file;
            return true;
        }
    }
    
    // 处理项目类
    $file = PROJECT_ROOT . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $className) . '.php';
    if (file_exists($file)) {
        require_once $file;
        return true;
    }
    
    return false;
});

// 加载Composer自动加载器（如果存在）
if (file_exists(PROJECT_ROOT . '/vendor/autoload.php')) {
    require_once PROJECT_ROOT . '/vendor/autoload.php';
}

// 加载测试辅助类
require_once __DIR__ . '/Builder/Builder.php';
require_once __DIR__ . '/Manager/JobManager.php';
require_once __DIR__ . '/Manager/PrinterManager.php';
require_once __DIR__ . '/Model/Job.php';
require_once __DIR__ . '/Model/Printer.php';
require_once __DIR__ . '/Transport/Client.php';

// 加载测试文件管理器
require_once __DIR__ . '/TestFileManager.php';

// 设置测试环境变量
if (!isset($_ENV['PRINTER_IP'])) {
    $_ENV['PRINTER_IP'] = '10.1.0.12';
}

if (!isset($_ENV['PRINTER_NAME'])) {
    $_ENV['PRINTER_NAME'] = 'EPSON L4260 Series';
}

if (!isset($_ENV['TEST_TIMEOUT'])) {
    $_ENV['TEST_TIMEOUT'] = '30';
}

// 创建测试输出目录
$testOutputDir = PROJECT_ROOT . DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR . 'output';
if (!is_dir($testOutputDir)) {
    mkdir($testOutputDir, 0755, true);
}

// 设置测试输出路径
define('TEST_OUTPUT_DIR', $testOutputDir);

// 创建日志目录
$logDir = PROJECT_ROOT . DIRECTORY_SEPARATOR . 'logs';
if (!is_dir($logDir)) {
    mkdir($logDir, 0755, true);
}

define('LOG_DIR', $logDir);

// 测试辅助函数
function createTestFile($filename, $content = null)
{
    $filepath = TEST_OUTPUT_DIR . DIRECTORY_SEPARATOR . $filename;
    
    if ($content === null) {
        $content = "测试文件\n";
        $content .= "创建时间: " . date('Y-m-d H:i:s') . "\n";
        $content .= "文件名: $filename\n";
        $content .= str_repeat('=', 50) . "\n";
        $content .= "这是一个自动生成的测试文件。\n";
    }
    
    file_put_contents($filepath, $content);
    return $filepath;
}

function cleanupTestFiles($pattern = 'test_*')
{
    $files = glob(TEST_OUTPUT_DIR . DIRECTORY_SEPARATOR . $pattern);
    foreach ($files as $file) {
        if (is_file($file)) {
            unlink($file);
        }
    }
}

function logTestMessage($message, $level = 'INFO')
{
    $logFile = LOG_DIR . DIRECTORY_SEPARATOR . 'test_' . date('Y-m-d') . '.log';
    $timestamp = date('Y-m-d H:i:s');
    $logEntry = "[$timestamp] [$level] $message" . PHP_EOL;
    file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX);
}

function isPrinterOnline($ip = null)
{
    $ip = $ip ?: $_ENV['PRINTER_IP'];
    $command = "ping -n 1 -w 1000 $ip";
    $output = shell_exec($command);
    
    return (strpos($output, 'TTL=') !== false || strpos($output, 'time<') !== false);
}

function isWindowsPrinterInstalled($printerName = null)
{
    $printerName = $printerName ?: $_ENV['PRINTER_NAME'];
    $command = 'powershell -Command "Get-Printer | Where-Object {$_.Name -like \"*EPSON*\" -or $_.Name -like \"*L4260*\"} | Select-Object Name"';
    $output = shell_exec($command);
    
    return ($output && (strpos($output, 'EPSON') !== false || strpos($output, 'L4260') !== false));
}

function getSystemInfo()
{
    return [
        'php_version' => PHP_VERSION,
        'os' => PHP_OS,
        'memory_limit' => ini_get('memory_limit'),
        'max_execution_time' => ini_get('max_execution_time'),
        'timezone' => date_default_timezone_get(),
        'printer_ip' => $_ENV['PRINTER_IP'],
        'printer_name' => $_ENV['PRINTER_NAME'],
        'project_root' => PROJECT_ROOT,
        'test_output_dir' => TEST_OUTPUT_DIR,
        'log_dir' => LOG_DIR
    ];
}

/**
 * 验证测试文件完整性
 */
function validateTestFiles(): array
{
    return \Tests\TestFileManager::checkTestFilesIntegrity();
}

/**
 * 获取PDF测试文件路径
 */
function getPdfTestFile(string $name = 'helloworld'): string
{
    return \Tests\TestFileManager::getPdfTestFile($name);
}

/**
 * 创建临时PDF测试文件
 */
function createTempPdfFile(string $content = 'Test Content'): string
{
    return \Tests\TestFileManager::createTempPdfFile($content);
}

// 注册关闭函数，清理测试环境
register_shutdown_function(function() {
    // 清理临时测试文件
    $tempFiles = glob(sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit_*');
    foreach ($tempFiles as $file) {
        if (is_file($file) && (time() - filemtime($file)) > 3600) { // 删除1小时前的文件
            unlink($file);
        }
    }
    
    // 记录测试会话结束
    logTestMessage('测试会话结束');
});

// 输出测试环境信息
if (php_sapi_name() === 'cli') {
    echo "\n" . str_repeat('=', 60) . "\n";
    echo "EPSON L4260 打印解决方案 - 测试环境\n";
    echo str_repeat('=', 60) . "\n";
    
    $systemInfo = getSystemInfo();
    foreach ($systemInfo as $key => $value) {
        echo sprintf("%-20s: %s\n", ucfirst(str_replace('_', ' ', $key)), $value);
    }
    
    echo str_repeat('=', 60) . "\n";
    
    // 检查打印机连接状态
    echo "检查打印机连接状态...\n";
    
    if (isPrinterOnline()) {
        echo "✓ 打印机网络连接正常\n";
    } else {
        echo "✗ 打印机网络连接失败\n";
    }
    
    if (isWindowsPrinterInstalled()) {
        echo "✓ Windows打印机已安装\n";
    } else {
        echo "✗ Windows打印机未安装\n";
    }
    
    echo str_repeat('=', 60) . "\n\n";
}

// 记录测试会话开始
logTestMessage('测试会话开始 - PHP ' . PHP_VERSION . ' on ' . PHP_OS);
logTestMessage('打印机IP: ' . $_ENV['PRINTER_IP']);
logTestMessage('打印机名称: ' . $_ENV['PRINTER_NAME']);

// 设置全局异常处理器
set_exception_handler(function($exception) {
    logTestMessage('未捕获的异常: ' . $exception->getMessage(), 'ERROR');
    logTestMessage('异常堆栈: ' . $exception->getTraceAsString(), 'ERROR');
});

// 设置错误处理器
set_error_handler(function($severity, $message, $file, $line) {
    if (!(error_reporting() & $severity)) {
        return false;
    }
    
    $errorTypes = [
        E_ERROR => 'ERROR',
        E_WARNING => 'WARNING',
        E_NOTICE => 'NOTICE',
        E_USER_ERROR => 'USER_ERROR',
        E_USER_WARNING => 'USER_WARNING',
        E_USER_NOTICE => 'USER_NOTICE'
    ];
    
    $errorType = $errorTypes[$severity] ?? 'UNKNOWN';
    logTestMessage("$errorType: $message in $file on line $line", $errorType);
    
    return false;
});

echo "测试环境初始化完成\n";